Method-Level Security

Java Technologies - স্প্রিং সিকিউরিটি (Spring Security)
117
117

Method-Level Security হল Spring Security-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে ক্লাস বা মেথড স্তরে নিরাপত্তা নিয়ন্ত্রণ করতে দেয়। এর মাধ্যমে আপনি নির্দিষ্ট মেথড বা ক্লাসের জন্য authentication এবং authorization নির্ধারণ করতে পারেন, যাতে শুধুমাত্র নির্দিষ্ট রোল বা প্রিভিলেজধারী ব্যবহারকারী সেই মেথড বা ক্লাস অ্যাক্সেস করতে পারে।

Spring Security-তে মেথড লেভেলে নিরাপত্তা চালু করতে @EnableGlobalMethodSecurity অ্যানোটেশন ব্যবহার করা হয়, এবং এর মধ্যে আপনি prePostEnabled, securedEnabled, অথবা jsr250Enabled অপশন ব্যবহার করতে পারেন।


Method-Level Security এর বিভিন্ন ধরনের কনফিগারেশন

Spring Security-তে মেথড-লেভেল সিকিউরিটি কনফিগার করার জন্য প্রধানত তিনটি পদ্ধতি ব্যবহার করা হয়:

  1. @Secured
  2. @PreAuthorize / @PostAuthorize
  3. @RolesAllowed (JSR-250 Annotations)

1. @EnableGlobalMethodSecurity ব্যবহার করা

প্রথমে Spring Security-তে Method-Level Security সক্ষম করতে @EnableGlobalMethodSecurity অ্যানোটেশন ব্যবহার করতে হবে। এই অ্যানোটেশনটি ক্লাস বা কনফিগারেশনে ব্যবহার করতে হবে, এবং এর মধ্যে আপনি কোন ধরনের নিরাপত্তা সক্ষম করবেন তা নির্ধারণ করতে পারেন।

উদাহরণ (Method-Level Security Enable):

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // Security Configuration Code
}
  • prePostEnabled: @PreAuthorize এবং @PostAuthorize অ্যানোটেশনগুলি সক্রিয় করে।
  • securedEnabled: @Secured অ্যানোটেশন সক্রিয় করে।
  • jsr250Enabled: @RolesAllowed অ্যানোটেশন সক্রিয় করে।

2. @Secured

@Secured অ্যানোটেশনটি ব্যবহারকারীর রোল ভিত্তিক অ্যাক্সেস কন্ট্রোল প্রয়োগ করতে সাহায্য করে। এটি সাধারণত মেথডের উপর রোল বা প্রিভিলেজ অ্যাসাইন করতে ব্যবহৃত হয়।

উদাহরণ (Secured Annotation):

import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Secured("ROLE_ADMIN")
    public void performAdminTask() {
        System.out.println("Admin Task Performed");
    }

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public void performUserOrAdminTask() {
        System.out.println("User or Admin Task Performed");
    }
}
  • এখানে performAdminTask মেথডটি শুধুমাত্র ROLE_ADMIN রোলধারী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য।
  • performUserOrAdminTask মেথডটি ROLE_USER এবং ROLE_ADMIN উভয় রোলধারী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য।

3. @PreAuthorize এবং @PostAuthorize

@PreAuthorize এবং @PostAuthorize অ্যানোটেশনগুলি অধিক কাস্টমাইজেবল নিরাপত্তা কন্ট্রোল প্রদান করে। @PreAuthorize মেথড চালানোর আগে অ্যাক্সেস কন্ট্রোল চেক করে, এবং @PostAuthorize মেথড শেষ হওয়ার পর।

উদাহরণ (PreAuthorize / PostAuthorize):

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @PreAuthorize("hasRole('ADMIN') and #userId == authentication.name")
    public void performTaskForUser(String userId) {
        System.out.println("Task performed for user: " + userId);
    }

    @PostAuthorize("returnObject.username == authentication.name")
    public User getUserDetails(String userId) {
        return new User(userId, "Some Details");
    }
}
  • @PreAuthorize: performTaskForUser মেথডটি শুধুমাত্র তখনই এক্সিকিউট হবে যখন ব্যবহারকারী ADMIN রোলধারী হবে এবং তার userId মেথডে পাঠানো userId এর সমান হবে।
  • @PostAuthorize: getUserDetails মেথডের শেষে, এটি চেক করবে যে রিটার্ন হওয়া অবজেক্টের username ব্যবহারকারীর authentication.name এর সাথে মেলে কিনা।

4. @RolesAllowed (JSR-250)

@RolesAllowed JSR-250 স্ট্যান্ডার্ডের অংশ এবং এটি মেথডের জন্য রোল নির্ধারণ করে। এটি @Secured এর মতো কাজ করে, তবে এটি Java EE-এর অংশ এবং সাধারণত Java EE অথবা Spring Framework সহ ব্যবহৃত হয়।

উদাহরণ (RolesAllowed):

import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @RolesAllowed("ADMIN")
    public void performAdminTask() {
        System.out.println("Admin Task Performed");
    }

    @RolesAllowed({"USER", "ADMIN"})
    public void performUserOrAdminTask() {
        System.out.println("User or Admin Task Performed");
    }
}
  • @RolesAllowed: এই অ্যানোটেশনটি ROLE_ADMIN বা ROLE_USER ব্যবহারকারীকে মেথড অ্যাক্সেসের অনুমতি দেয়।

Method-Level Security এর অন্যান্য গুরুত্বপূর্ণ বিষয়

  1. কাস্টম নিরাপত্তা চেক: আপনি @PreAuthorize অথবা @PostAuthorize এর মধ্যে SpEL (Spring Expression Language) ব্যবহার করে কাস্টম নিরাপত্তা চেক করতে পারেন।

    উদাহরণ:

    @PreAuthorize("hasPermission(#document, 'read')")
    public void readDocument(Document document) {
        // Document পড়া
    }
    
  2. Method-Level Security Testing: আপনি @Secured, @PreAuthorize, অথবা @RolesAllowed এর নিরাপত্তা পরীক্ষা করতে পারেন @WithMockUser ব্যবহার করে।

    উদাহরণ:

    @Test
    @WithMockUser(roles = "ADMIN")
    public void testAdminTask() {
        myService.performAdminTask(); // This should work
    }
    
  3. SpEL (Spring Expression Language): @PreAuthorize এবং @PostAuthorize অ্যানোটেশনগুলির মধ্যে SpEL ব্যবহার করা যেতে পারে, যা আপনাকে আরও কাস্টম এবং শর্তাধীন অনুমতি প্রদান করতে সক্ষম করে।

    উদাহরণ:

    @PreAuthorize("hasRole('ADMIN') or #userId == authentication.name")
    public void someMethod(String userId) {
        // Perform some task
    }
    

উপসংহার

Spring Security-তে Method-Level Security হল একটি শক্তিশালী টুল যা আপনাকে নিরাপত্তা নিয়ন্ত্রণের আরও উচ্চ স্তরের কাস্টমাইজেশন প্রদান করে। আপনি মেথড বা ক্লাসের উপর ভিত্তি করে ব্যবহারকারীর রোল, প্রিভিলেজ এবং অন্যান্য শর্ত অনুযায়ী অ্যাক্সেস কন্ট্রোল করতে পারবেন। @Secured, @PreAuthorize, @PostAuthorize, এবং @RolesAllowed এর মাধ্যমে সহজে মেথড নিরাপত্তা পরিচালনা করা সম্ভব।

Content added By

Method-Level Security কি এবং এর প্রয়োগ

123
123

Method-level security হল Spring Security-এর একটি বৈশিষ্ট্য যা আপনাকে নির্দিষ্ট মেথডের জন্য নিরাপত্তা কনফিগার করার সুবিধা দেয়। এর মাধ্যমে আপনি শুধুমাত্র নির্দিষ্ট রোল, পারমিশন বা শর্তের অধীনে একটি মেথড অ্যাক্সেস করার অনুমতি দিতে পারেন। এটি মূলত annotation-based security প্রয়োগে ব্যবহৃত হয় এবং খুবই কার্যকরী যখন আপনি fine-grained control চান যে কোন ব্যবহারকারী বা রোল কোন ফিচার অ্যাক্সেস করতে পারবে।

Spring Security-তে method-level security কে প্রাথমিকভাবে দুইটি মূল উপায়ে ব্যবহার করা হয়:

  1. Authorization (অথরাইজেশন) – কোন ব্যবহারকারী বা রোল কে কোন মেথড অ্যাক্সেস করতে পারবে তা নির্ধারণ করা।
  2. Authentication (প্রমাণীকরণ) – কোন ব্যবহারকারী সিস্টেমে লগ ইন করেছেন এবং তাদের শংসাপত্র যাচাই করা।

Spring Security Method-Level Security-এর প্রধান ধরনের Annotation

  1. @PreAuthorize
    • @PreAuthorize annotation ব্যবহার করে মেথডের আগে authorization চেক করা হয়। এটি SpEL (Spring Expression Language) ব্যবহার করে condition নির্ধারণ করতে পারে।
  2. @Secured
    • @Secured annotation শুধু নির্দিষ্ট রোল বা পারমিশন মেনে মেথড অ্যাক্সেস করতে অনুমতি দেয়। তবে এটি SpEL এর চেয়ে কম ফ্লেক্সিবল।
  3. @PostAuthorize
    • @PostAuthorize annotation ব্যবহার করে মেথডের পর authorization চেক করা হয়। এটি মূলত মেথডের আউটপুট পর্যালোচনা করার জন্য ব্যবহৃত হয়।
  4. @RolesAllowed
    • @RolesAllowed annotation Java EE এর একটি অংশ এবং এটি সেভাবে Spring Security এর মাধ্যমে কাজ করে। তবে এটি @Secured এর মতো রোল চেক করতে ব্যবহৃত হয়।

Method-Level Security সক্রিয় করা

1. Method-level security সক্রিয় করা

Spring Security-তে method-level security ব্যবহারের জন্য @EnableGlobalMethodSecurity annotation যোগ করতে হয়। এটি আপনার Spring Security configuration ক্লাসে থাকতে হবে।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig {
    // Configuration for method-level security
}
  • prePostEnabled = true: এটি @PreAuthorize এবং @PostAuthorize ব্যবহার করতে সক্ষম করবে।
  • securedEnabled = true: এটি @Secured annotation এর ব্যবহার সক্ষম করবে।

Method-Level Security Example

1. @PreAuthorize ব্যবহার

@PreAuthorize ব্যবহার করে মেথডের আগে condition চেক করা হয়। এখানে আমরা SpEL ব্যবহার করছি যা রোল বা পারমিশনের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করবে।

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @PreAuthorize("hasRole('ADMIN')")
    public void createProduct() {
        System.out.println("Product created!");
    }

    @PreAuthorize("hasRole('USER') or hasRole('ADMIN')")
    public void viewProduct() {
        System.out.println("Product viewed!");
    }

    @PreAuthorize("hasPermission(#productId, 'Product', 'READ')")
    public void viewProductDetails(Long productId) {
        System.out.println("Product details viewed for productId: " + productId);
    }
}
  • @PreAuthorize("hasRole('ADMIN')"): শুধুমাত্র ADMIN রোলের ব্যবহারকারীরা createProduct() মেথডটি অ্যাক্সেস করতে পারবেন।
  • @PreAuthorize("hasRole('USER') or hasRole('ADMIN')"): USER বা ADMIN রোলের ব্যবহারকারী viewProduct() মেথডটি অ্যাক্সেস করতে পারবেন।
  • @PreAuthorize("hasPermission(#productId, 'Product', 'READ')"): এই method-এ hasPermission ব্যবহার করে permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করা হয়েছে।

2. @Secured ব্যবহার

@Secured একটি নির্দিষ্ট রোল বা permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি খুবই সরল এবং SpEL এর চেয়ে কম ফ্লেক্সিবল।

import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @Secured("ROLE_ADMIN")
    public void createProduct() {
        System.out.println("Product created!");
    }

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public void viewProduct() {
        System.out.println("Product viewed!");
    }
}
  • @Secured("ROLE_ADMIN"): শুধুমাত্র ROLE_ADMIN ব্যবহারকারী createProduct() মেথড অ্যাক্সেস করতে পারবেন।
  • @Secured({"ROLE_USER", "ROLE_ADMIN"}): ROLE_USER বা ROLE_ADMIN ব্যবহারকারী viewProduct() মেথড অ্যাক্সেস করতে পারবেন।

3. @PostAuthorize ব্যবহার

@PostAuthorize annotation মেথডের পরে ব্যবহার করা হয়। এটি মেথডের আউটপুট যাচাই করার জন্য ব্যবহৃত হয়।

import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @PostAuthorize("returnObject.owner == authentication.name")
    public Product getProduct(Long productId) {
        return productRepository.findById(productId).orElse(null);
    }
}
  • @PostAuthorize("returnObject.owner == authentication.name"): এটি চেক করে যে Product অবজেক্টটির owner বর্তমানে লগ ইন করা ব্যবহারকারীর নামের সাথে মেলাচ্ছে কি না।

৪. @RolesAllowed ব্যবহার

@RolesAllowed Java EE-এর একটি annotation এবং Spring Security-এও এটি ব্যবহৃত হয়। এটি শুধুমাত্র নির্দিষ্ট রোলগুলির জন্য মেথড অ্যাক্সেস প্রদান করে।

import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @RolesAllowed("ADMIN")
    public void createProduct() {
        System.out.println("Product created!");
    }

    @RolesAllowed({"USER", "ADMIN"})
    public void viewProduct() {
        System.out.println("Product viewed!");
    }
}
  • @RolesAllowed("ADMIN"): শুধুমাত্র ADMIN রোলের ব্যবহারকারী createProduct() মেথডটি অ্যাক্সেস করতে পারবেন।

Conclusion

Spring Security-তে method-level security ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট মেথডের জন্য নিরাপত্তা নিয়ন্ত্রণ করতে পারেন। এটি fine-grained access control প্রদান করে, যেখানে আপনি নির্দিষ্ট রোল, পারমিশন বা শর্তের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। Spring Security-তে বিভিন্ন ধরনের annotations (যেমন @PreAuthorize, @Secured, @PostAuthorize, @RolesAllowed) ব্যবহার করে মেথড-ভিত্তিক নিরাপত্তা কনফিগার করা যায়।

Content added By

@PreAuthorize, @PostAuthorize, এবং @Secured Annotation এর ব্যবহার

96
96

স্প্রিং সিকিউরিটির @PreAuthorize, @PostAuthorize, এবং @Secured অ্যানোটেশনগুলি মেথড লেভেল সিকিউরিটি প্রয়োগ করতে ব্যবহৃত হয়। এগুলি আপনাকে স্প্রিং অ্যাপ্লিকেশনগুলিতে সিকিউরিটি নিয়মগুলো সরাসরি মেথডের উপর প্রয়োগ করার সুবিধা দেয়, যা কোডে রোল-ভিত্তিক অথরাইজেশন বা এক্সপ্রেশন-ভিত্তিক অথরাইজেশন নির্ধারণ করতে সাহায্য করে।

১. @PreAuthorize অ্যানোটেশন

@PreAuthorize অ্যানোটেশনটি একটি মেথড এক্সিকিউট হওয়ার আগে নির্দিষ্ট শর্ত পূর্ণ হলে এক্সিকিউশন অনুমোদন দেয়। এটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) ব্যবহার করে শর্ত নির্ধারণ করতে পারে।

ব্যবহার:

  • @PreAuthorize অ্যানোটেশন ব্যবহার করে আপনি মেথডের এক্সিকিউশন আগে নিশ্চিত করতে পারেন যে নির্দিষ্ট শর্ত বা অনুমতি রয়েছে।
  • সাধারণত স্প্রিং সিকিউরিটি কনফিগারেশনের মাধ্যমে অ্যাক্সেস কন্ট্রোল ইমপ্লিমেন্ট করা হয়।

উদাহরণ:

@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) {
    // মেথড যা শুধুমাত্র ADMIN রোল থাকা ইউজারের জন্য এক্সিকিউট হবে
    userRepository.deleteById(userId);
}

এখানে, deleteUser মেথডটি শুধুমাত্র সেই ব্যবহারকারীদের জন্য এক্সিকিউট হবে যাদের রোল "ADMIN"।

@PreAuthorize অ্যানোটেশনে স্পেল এক্সপ্রেশন ব্যবহার করা যায় যেমন:

  • hasRole('ROLE_USER') - ইউজার যদি 'USER' রোল না থাকে, মেথডটি এক্সিকিউট হবে না।
  • @PreAuthorize("hasPermission(#user, 'DELETE')") - নির্দিষ্ট শর্তে ফাংশনটি এক্সিকিউট হবে।

২. @PostAuthorize অ্যানোটেশন

@PostAuthorize অ্যানোটেশনটি মেথড এক্সিকিউট হওয়ার পর শর্ত যাচাই করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি মেথডের রিটার্ন ভ্যালু এক্সিকিউট হওয়ার পর পরীক্ষা করতে পারেন যে সেই রিটার্ন ভ্যালুর উপর ভিত্তি করে অনুমতি আছে কিনা।

ব্যবহার:

  • @PostAuthorize অ্যানোটেশনটি রিটার্ন ভ্যালুর উপর ভিত্তি করে অথরাইজেশন নির্ধারণ করে।
  • এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে মেথডটি কিছু প্রক্রিয়া সম্পাদন করার পর রিটার্ন ডেটার উপর ভিত্তি করে শর্ত নির্ধারণ করা হয়।

উদাহরণ:

@PostAuthorize("returnObject.username == authentication.name")
public User getUser(Long userId) {
    return userRepository.findById(userId).orElse(null);
}

এখানে, getUser মেথডটি শুধুমাত্র সেই ক্ষেত্রে রিটার্ন হবে যখন ইউজারের username বর্তমান ইউজারের সাথে মেলে (authentication.name)।

৩. @Secured অ্যানোটেশন

@Secured অ্যানোটেশনটি মেথডের উপর সরাসরি রোল বা অথরিটি ভিত্তিক অ্যাক্সেস কন্ট্রোল প্রয়োগ করতে ব্যবহৃত হয়। এটি একটি সহজ পদ্ধতি যা শুধুমাত্র নির্দিষ্ট রোল বা অনুমতিসমূহকে মেথডের জন্য অনুমোদন দেয়। তবে এটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) সমর্থন করে না, যেমন @PreAuthorize বা @PostAuthorize

ব্যবহার:

  • @Secured অ্যানোটেশনটি একাধিক রোলের সাথে ব্যবহৃত হতে পারে।

উদাহরণ:

@Secured("ROLE_ADMIN")
public void createUser(User user) {
    // এই মেথডটি শুধুমাত্র "ROLE_ADMIN" রোল থাকা ইউজারের জন্য এক্সিকিউট হবে
    userRepository.save(user);
}

এখানে, createUser মেথডটি শুধুমাত্র সেই ব্যবহারকারীদের জন্য এক্সিকিউট হবে যাদের রোল "ROLE_ADMIN"।

তুলনা:

অ্যানোটেশনকাজের প্রক্রিয়াসুবিধাউদাহরণ
@PreAuthorizeমেথড এক্সিকিউট হওয়ার আগে শর্ত যাচাইস্পেল এক্সপ্রেশন ব্যবহার করা যায়@PreAuthorize("hasRole('ADMIN')")
@PostAuthorizeমেথড এক্সিকিউট হওয়ার পরে শর্ত যাচাইরিটার্ন ভ্যালুর উপর ভিত্তি করে অনুমতি যাচাই@PostAuthorize("returnObject.username == authentication.name")
@Securedনির্দিষ্ট রোল ভিত্তিক অথরাইজেশনসহজ রোল ভিত্তিক অথরাইজেশন@Secured("ROLE_ADMIN")

উপসংহার:

  • @PreAuthorize এবং @PostAuthorize অ্যানোটেশনগুলির মাধ্যমে আপনি স্প্রিং সিকিউরিটিতে খুবই শক্তিশালী অথরাইজেশন পলিসি তৈরি করতে পারেন, যেহেতু এই দুটি স্পেল এক্সপ্রেশন সমর্থন করে, যা আরও নমনীয় কনফিগারেশন দেয়।
  • @Secured একটি সরল পদ্ধতি, যেখানে আপনি সহজে রোল-ভিত্তিক এক্সেস কন্ট্রোল করতে পারেন।

এই অ্যানোটেশনগুলি ব্যবহার করে আপনি স্প্রিং অ্যাপ্লিকেশনে মেথড লেভেল অথরাইজেশন এবং সিকিউরিটি প্রয়োগ করতে পারবেন।

Content added By

উদাহরণ সহ Method-Level Security কনফিগারেশন

80
80

Spring Security তে Method-Level Security হল এমন একটি প্রক্রিয়া যার মাধ্যমে আপনি মেথড লেভেলে নিরাপত্তা কনফিগার করতে পারেন। এটি আপনাকে নির্দিষ্ট মেথডে কোন রোল বা পারমিশন অ্যাসাইন করতে সাহায্য করে। Spring Security এর Method-Level Security কনফিগারেশন দুইটি প্রধান পদ্ধতিতে করা যায়:

  1. @PreAuthorize: মেথডের উপরে এনোটেশন ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ।
  2. @Secured: নির্দিষ্ট রোল বা অথোরাইজেশন চেকের জন্য ব্যবহৃত হয়।
  3. @RolesAllowed: স্পেসিফিক রোলের জন্য মেথড অ্যাক্সেস কন্ট্রোল করে।

এছাড়াও, @EnableGlobalMethodSecurity এনোটেশন দিয়ে Method-level security চালু করতে হয়।


ধাপ ১: Method-Level Security চালু করা

@EnableGlobalMethodSecurity এনোটেশন ব্যবহার করে Method-Level Security সক্রিয় করতে হয়। এটি আপনার Spring Security কনফিগারেশন ক্লাসে যুক্ত করতে হবে।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig {
    // Method-level security এখানে কনফিগার করা হবে
}

এখানে prePostEnabled = true, securedEnabled = true, এবং jsr250Enabled = true ব্যবহার করা হয়েছে। এই প্যারামিটারগুলি method-level security এর জন্য বিভিন্ন বৈশিষ্ট্য সক্ষম করে।

  • prePostEnabled: @PreAuthorize এবং @PostAuthorize এনোটেশনগুলির জন্য সক্রিয় করা হয়।
  • securedEnabled: @Secured এনোটেশন সমর্থন করতে সক্ষম করা হয়।
  • jsr250Enabled: @RolesAllowed এনোটেশন সমর্থন করতে সক্ষম করা হয়।

ধাপ ২: Method-Level Security কনফিগারেশন উদাহরণ

এখন, Method-Level Security কনফিগার করতে আমরা বিভিন্ন এনোটেশন ব্যবহার করব:


1. @PreAuthorize (Pre Authorization)

@PreAuthorize এনোটেশন ব্যবহার করে আমরা নির্দিষ্ট শর্তে অ্যাক্সেস অনুমোদন বা প্রত্যাখ্যান করতে পারি। এই এনোটেশনটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) ব্যবহার করে কন্ডিশন চেক করতে দেয়।

উদাহরণ:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @PreAuthorize("hasRole('ADMIN')")
    public void createUser() {
        System.out.println("User created");
    }

    @PreAuthorize("hasRole('USER')")
    public void viewUser() {
        System.out.println("User details viewed");
    }

    @PreAuthorize("hasRole('USER') and #userId == authentication.principal.id")
    public void updateUser(Long userId) {
        System.out.println("User updated");
    }
}

এখানে:

  • createUser() মেথড শুধুমাত্র ADMIN রোল দ্বারা অ্যাক্সেস করা যাবে।
  • viewUser() মেথড শুধুমাত্র USER রোল দ্বারা অ্যাক্সেস করা যাবে।
  • updateUser(Long userId) মেথডে এটি যাচাই করা হয় যে, ব্যবহারকারী যে userId পাস করবে তা ঐ ব্যবহারকারীর নিজের আইডি।

2. @Secured (Role-Based Security)

@Secured এনোটেশন ব্যবহার করে আমরা মেথড লেভেলে রোল-ভিত্তিক নিরাপত্তা নিশ্চিত করতে পারি। এটি সাধারণত রোল নামের তালিকা গ্রহণ করে।

উদাহরণ:
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @Secured("ROLE_ADMIN")
    public void deleteProduct() {
        System.out.println("Product deleted");
    }

    @Secured({"ROLE_ADMIN", "ROLE_USER"})
    public void viewProduct() {
        System.out.println("Product viewed");
    }
}

এখানে:

  • deleteProduct() মেথড শুধুমাত্র ROLE_ADMIN রোল দ্বারা অ্যাক্সেস করা যাবে।
  • viewProduct() মেথড ROLE_ADMIN এবং ROLE_USER উভয় রোল দ্বারা অ্যাক্সেস করা যাবে।

3. @RolesAllowed (JSR-250 Standard)

@RolesAllowed এনোটেশনটি JSR-250 স্ট্যান্ডার্ড অনুসরণ করে এবং ব্যবহারকারীর রোলের ভিত্তিতে মেথড অ্যাক্সেস নিয়ন্ত্রণ করে।

উদাহরণ:
import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @RolesAllowed("ADMIN")
    public void cancelOrder() {
        System.out.println("Order cancelled");
    }

    @RolesAllowed({"USER", "ADMIN"})
    public void placeOrder() {
        System.out.println("Order placed");
    }
}

এখানে:

  • cancelOrder() মেথড শুধুমাত্র ADMIN রোল দ্বারা অ্যাক্সেস করা যাবে।
  • placeOrder() মেথড USER অথবা ADMIN রোল দ্বারা অ্যাক্সেস করা যাবে।

ধাপ ৩: Method-Level Security কনফিগারেশন ও টেস্ট

এখন, যেহেতু আমরা মেথড-লেভেল নিরাপত্তা কনফিগার করেছি, চলুন একটি উদাহরণ তৈরি করি যেখানে আমরা UserService এবং ProductService এর মেথডগুলো অ্যাক্সেস করার জন্য রোল যাচাই করি।

উদাহরণ:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SecurityTestController {

    @Autowired
    private UserService userService;

    @Autowired
    private ProductService productService;

    @GetMapping("/createUser")
    public String createUser() {
        userService.createUser(); // This should be accessible only by ADMIN
        return "User created";
    }

    @GetMapping("/viewUser")
    public String viewUser() {
        userService.viewUser(); // This should be accessible only by USER
        return "User details viewed";
    }

    @GetMapping("/deleteProduct")
    public String deleteProduct() {
        productService.deleteProduct(); // This should be accessible only by ADMIN
        return "Product deleted";
    }

    @GetMapping("/placeOrder")
    public String placeOrder() {
        productService.placeOrder(); // This should be accessible by both USER and ADMIN
        return "Order placed";
    }
}

এখন, এই API গুলোটি ব্যবহারকারী যখন কল করবে, তখন শুধুমাত্র নির্দিষ্ট রোলের ব্যবহারকারীই সেই মেথডগুলো অ্যাক্সেস করতে পারবে।


উপসংহার

Method-Level Security Spring Security-তে নিরাপত্তার একটি শক্তিশালী উপাদান যা আপনাকে মেথডের স্তরে নিরাপত্তা কনফিগার করার সুবিধা দেয়। @PreAuthorize, @Secured, এবং @RolesAllowed এনোটেশনগুলি আপনাকে নির্দিষ্ট রোল বা শর্ত অনুযায়ী মেথড অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়ক। Spring Security এ এই কনফিগারেশন অত্যন্ত কাস্টমাইজযোগ্য এবং সহজে পরিচালনা করা যায়।

Content added By
Promotion